package NEGOCIOS;

import BD.Pagosproveedores;
import BD.PersonFactory;
import java.awt.HeadlessException;
import java.util.Date;
import java.util.List;
import javax.swing.JOptionPane;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;


public class ControlPagoProveedores {
     //Declaracion de variables globales
    private SessionFactory sessionFactory = null;

    //Metodo para crear la session nesesaria para interactuar con la DB
    private Session crearSession() {
        Session session = null;
        try {
            sessionFactory = PersonFactory.getSessionFactory();
            session = sessionFactory.openSession();
        } catch (HibernateException he) {
            JOptionPane.showMessageDialog(null, "Error: " + he, "Error ocurrido"
                    + " en el control de Pagoempleados", 0);
            session.close();
        }
        return session;
    }
    
    //Metodo que devuelve un pago en especifico
    public Pagosproveedores seleccionarUno(int id) {
        //Crear objeto nesesaro para obtener la informacion de la DB
        Pagosproveedores pago = null;
        //Crear session
        Session session = crearSession();
        try {
            //Obtener pago de la BD
            pago = (Pagosproveedores) session.createQuery("from Pagosproveedores"
                    + " where id=" + id).list().get(0);
            //Si todo sale bien cierro session
            session.close();
        } catch (Exception ex) {
            //Si algo sale mal reporto el error y cierro session
            JOptionPane.showMessageDialog(null, "Error: " + "\n" + ex, 
                   "Error ocurrido al obtener el Pago del proveedor solicitado.",
                   0);
            session.close();
        }
        //Regresar el objeto obtenido
        return pago;
    }
    
    //Metodo que debuelve una lista con todos los pagos guardados en la DB
    public List seleccionarTodosLosPagos() {
        //Crear la lista que contrendra todos los pagos
        List pagos = null;
        //Crear la session
        Session session = crearSession();
        try {
            //Obtener todos los pagos guardados en la BD
            pagos = session.createQuery("from Pagosproveedores").list();
            //Si todo salio bien cierro session
            session.close();
        } catch (Exception ex) {
            //Si algo salio mal reporto el error y cierro session
            JOptionPane.showMessageDialog(null, "Error: " + "\n" + ex, 
                    "Error ocurrido al obtener los Pagos de los proveedores.", 0);
            session.close();
        }
        
        //Regresar la lista generada
        return pagos;
    }
    
    //Metodo para guardar pagos en la base de datos
    public void agregarPagoProveedor(Date fecha, String nombre, String rfc, 
            Double cantidad) {
        //Crear session
        Session session = crearSession();
        try {
            //Creo e inicion la transaccion para controlar la insercion
            Transaction tx = session.beginTransaction();
            tx.begin();

            /*Creo el objeto para armarlo y posteriormente guardarlo en la base
             de datos*/
            Pagosproveedores pagoProveedor = new Pagosproveedores();

            //Lleno el objeto para guardarlo en la base de datos
            pagoProveedor.setFecha(fecha);
            pagoProveedor.setNombre(nombre);
            pagoProveedor.setRfc(rfc);
            pagoProveedor.setTotal(cantidad);

            //Guardo el objeto en la base de datos
            session.save(pagoProveedor);
            //Si todo salio bien cierro session y termino la transaccion
            tx.commit();
            session.close();
        } catch (HibernateException | HeadlessException e) {
            session.close();
            throw e;
        }
    }

    //Metodo que actualiza un pago guardado en la DB
    public void actualizarPagoProveedor(int id, Date fecha, String nombre, String rfc, 
            Double cantidad) {
        //Creo la session
        Session session = crearSession();
        try {
            //Creo la transaccion
            Transaction tx = session.beginTransaction();
            //Obtengo el pago que se desea modificar
            Pagosproveedores pagoProveedor = seleccionarUno(id);

            //Inicio la transaccion
            tx.begin();

            //lleno el objeto con los datos nuevos
            pagoProveedor.setFecha(fecha);
            pagoProveedor.setNombre(nombre);
            pagoProveedor.setRfc(rfc);
            pagoProveedor.setTotal(cantidad);

            //Actualizo el objeto en la base de datos
            session.update(pagoProveedor);

            //si todo salio bien realizo la transacion y cierro session
            tx.commit();
            session.close();
        } catch (Exception e) {
            session.close();
            throw e;
        }
    }

    //Metodo que elimina un pago en espesifico
    public void eliminarPagoProveedor(int id) {
        //Creo la session
        Session session = crearSession();
        try {
            //Obtengo el objeto que quiero eliminar de la base de datos
            Pagosproveedores pagoProveedor = seleccionarUno(id);
            //Borro el objeto de la base de datos
            session.delete(pagoProveedor);
            //Cierro la session
            session.close();
        } catch (HibernateException he) {
            session.close();
            throw he;
        }
    }
    
    //Metodo para guardar una lista de objetos
    public void agregarVariosPagosProveedores(List<Pagosproveedores> proveedores){
        for(int i=0;i<proveedores.size();i++){
            agregarPagoProveedor(
                    proveedores.get(i).getFecha(), 
                    proveedores.get(i).getNombre(), 
                    proveedores.get(i).getRfc(), 
                    proveedores.get(i).getTotal());
        }
    }
}
